package com.zuul.main.config;

import com.common.entity.Code;
import com.common.entity.ResponseResult;
import com.common.utils.JwtUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * @create 2020-11-21 22:24
 */
@Component
public class LoginFilter extends ZuulFilter {
    //拦截类型
    @Override
    public String filterType() {
        return "pre";
    }

    //多个filter的执行顺序。数字小的先执行。
    @Override
    public int filterOrder() {
        return 0;
    }

    //是否拦截
    @Override
    public boolean shouldFilter() {
        //用户请求传递参数，有user就是登录用户，不拦截。没有就拦截。
        //1.获取上下文
        RequestContext currentContext = RequestContext.getCurrentContext();
        //2.获取request
        HttpServletRequest request = currentContext.getRequest();
        //3.获取请求路径
        String uri = request.getRequestURI();
        return  false;
        //4.放行登录页面
//        if(uri.contains("/login")) {
//            //进入下面的run方法
//            return false;
//        }
//
//        if(uri.contains("swagger")) {
//            //进入下面的run方法
//            return false;
//        }
//
//        if(uri.contains(".js")) {
//            //进入下面的run方法
//            return false;
//        }
//
//        if(uri.contains(".css")) {
//            //进入下面的run方法
//            return false;
//        }
//        if(uri.contains(".png")) {
//            //进入下面的run方法
//            return false;
//        }
//        //5.拦截其他页面
//        return true;
    }

    //拦截执行的业务代码
    @Override
    public Object run() throws ZuulException {
        System.out.println("执行拦截器，登录验证");
        //1.获取上下文，通过上下文获取token。
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = context.getRequest();
        String token = request.getHeader("token");
        if(JwtUtil.verify(token)) {  //token通过验证
            //验证通过，放行
            return null;
        }
        System.out.println("没有登录");
        //拦截用户
        context.setSendZuulResponse(false);
        try {
            //给用户响应信息。返回的应该是json格式，需要自己序列化。
            context.setResponseBody(new ObjectMapper().
                    writeValueAsString(ResponseResult.error(Code.NO_Authenticate)));
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        //放行
        return null;
    }
}

